using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.DependencyInjection;
using MsBox.Avalonia;
using MsBox.Avalonia.Dto;
using MsBox.Avalonia.Enums;
using MsBox.Avalonia.Models;
using ReactiveUI;
using SchoolApp.Msgs;
using SchoolApp.ViewModels;

namespace SchoolApp.Views;

public partial class LoginWindow : Window
{
    // private IDisposable _subLogin;
    // private IDisposable _subError;

    public LoginWindow()
    {
        InitializeComponent();
        DataContext = Program.ServiceProvider.GetRequiredService<LoginViewModel>();
    }

    private void LoginWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        txtCode.Focus();
        WeakReferenceMessenger.Default.Register<LoginMsg>(this, (r,msg) =>
        {
            Console.WriteLine($"用户已登录: {msg.OperatorCode}");
            // 创建主窗口
            var mainWindow = new MainWindow();

            // 设置Program的MainWindow引用
            Program.MainWindow = mainWindow;

            // 显示主窗口
            mainWindow.Show();

            // 关闭登录窗口
            this.Close();
        });
        // _subLogin = MessageBus.Current.Listen<LoginMsg>()
        //     .Subscribe(msg =>
        //     {
        //         Console.WriteLine($"用户已登录: {msg.OperatorCode}");
        //         // 创建主窗口
        //         var mainWindow = new MainWindow();
        //
        //         // 设置Program的MainWindow引用
        //         Program.MainWindow = mainWindow;
        //
        //         // 显示主窗口
        //         mainWindow.Show();
        //
        //         // 关闭登录窗口
        //         this.Close();
        //     });
        WeakReferenceMessenger.Default.Register<ErrorMsg>(this, async (r, msg) =>
        {
            var messageBox = MessageBoxManager.GetMessageBoxCustom(
                new MessageBoxCustomParams
                {
                    ContentTitle = "错误提示",
                    ContentMessage = msg.Data,
                    ButtonDefinitions = [new ButtonDefinition() { Name = "Ok", IsDefault = true }],
                    Icon = MsBox.Avalonia.Enums.Icon.Error,
                    WindowStartupLocation = WindowStartupLocation.CenterScreen, // 居中显示
                    Topmost = true,
                }).ShowWindowDialogAsync(this);
        });
        // _subError = MessageBus.Current.Listen<ErrorMsg>().Subscribe(async msg =>
        // {
        //     // // 创建一个标准的消息框
        //     // var box = MessageBoxManager.GetMessageBoxStandard(
        //     //     "标题", 
        //     //     "你确定要删除吗？", 
        //     //     ButtonEnum.YesNo);
        //     //
        //     // // 显示消息框并等待用户响应
        //     // var result = await box.ShowAsync();
        //     //
        //     // // 根据用户的选择执行相应的操作
        //     // if (result == ButtonResult.Yes)
        //     // {
        //     //     // 用户选择了“是”
        //     // }
        //     // else
        //     // {
        //     //     // 用户选择了“否”
        //     // }
        //     // var box = MessageBoxManager.GetMessageBoxStandard("错误", msg.Data,ButtonEnum.Ok,MsBox.Avalonia.Enums.Icon.Error, WindowStartupLocation.CenterOwner);
        //     // await box.ShowAsync();
        //
        //     var messageBox = MessageBoxManager.GetMessageBoxCustom(
        //         new MessageBoxCustomParams
        //         {
        //             ContentTitle = "错误提示",
        //             ContentMessage = msg.Data,
        //             ButtonDefinitions = [new ButtonDefinition() { Name = "Ok", IsDefault = true }],
        //             Icon = MsBox.Avalonia.Enums.Icon.Error,
        //             WindowStartupLocation = WindowStartupLocation.CenterScreen, // 居中显示
        //             Topmost = true,
        //         });
        //     await messageBox.ShowAsync();
        // });
    }

    private void LoginWindow_OnUnloaded(object sender, RoutedEventArgs e)
    {
        // 取消订阅（避免内存泄漏）
        // _subLogin.Dispose();
        // _subError.Dispose();

        WeakReferenceMessenger.Default.Unregister<LoginMsg>(this);
        WeakReferenceMessenger.Default.Unregister<ErrorMsg>(this);
    }

    private void txtCode_OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key != Key.Enter)
            return;
        txtPwd.Focus();
    }

    private void txtPwd_OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key != Key.Enter) return;
        if (btnLogin.Command != null && btnLogin.Command.CanExecute(null))
            btnLogin.Command.Execute(null);
    }
}